Dataformのコンパイル時にDataformがGitリポジトリと接続できない場合の動作を観察してみた

Dataformのコンパイル時にDataformがGitリポジトリと接続できない場合の動作を観察してみた

Dataformと連携するサードパーティのGitを自分で管理している場合に、そのGitサーバがダウンしている時にコンパイルなどを行うとどうなるか観察してみました
Clock Icon2024.10.10

概要

Dataformはサードパーティのリポジトリと接続することができますが、この場合はGCEやオンプレミスのサーバにインストールしたGit(GitHubやGitLabなど)でも接続することができます。

しかしながらGCEやオンプレミスにGitをインストールしてそのGitリポジトリと連携した場合は当然SaaS版とは異なり自身で可用性・冗長性を担保する必要があります。

Dataformはリポジトリ、ワークスペースのプログラムをコンパイルして実行するという点、またコンパイル結果は24時間で期限切れとなってしまいます。
https://cloud.google.com/dataform/docs/code-lifecycle?hl=ja#expiration_of_compilation_results

よって自身でGitサーバを管理してDataformを本番運用している場合はリポジトリの可用性も重要なポイントになると考えます(内蔵GitやSaaSのGitを用いている場合はあまり意識しなくてよいかと)。

気になったのはGitサーバがダウンしている時にコンパイルをするとどんな動作をするかという点です。

前置きが長くなりましたが今回の記事ではDataformと連携しているGitサーバがダウンしている場合にコンパイルを行うとどうなるのかを実際に観察してみました。
興味がありましたら読んでみてください。

やってみる

※DataformとGCE上にインストールしたGit(今回はGitLabを用いています)は連携している前提です。

イメージは以下となります。
devio_image1

Dataformの連携設定はすでに実施しています。
スクリーンショット 2024-10-10 21.57.46

GitをホスティングしているGCEインスタンスを停止させます。
スクリーンショット 2024-10-10 22.05.24

インスタンスが停止しているので当然Gitリポジトリへはアクセスできません。この状態でコンパイルをしてみます。

コンパイルは以下のREST APIで実行します。

Method: projects.locations.repositories.compilationResults.create

https://cloud.google.com/dataform/reference/rest/v1beta1/projects.locations.repositories.compilationResults/create

curlで叩きます。

curl -X POST "https://dataform.googleapis.com/v1beta1/projects/プロジェクトID/locations/asia-northeast1/repositories/リポジトリ名/compilationResults" \
  --header "Authorization: Bearer $(gcloud auth print-access-token)" \
  --header "Content-Type: application/json" \
  --data '{"gitCommitish":"main"}'

プロジェクトIDやリポジトリ名は各環境の値にします。
叩いた結果は以下でした。

{
  "error": {
    "code": 400,
    "message": "Remote repository 'git@リポジトリURL/プロジェクト名.git' could not be reached.",
    "status": "INVALID_ARGUMENT"
  }
}

HTTPステータスコード400(Bad Request)となりました。
もう少し確認したいので今度はDataformのコンソールからワークスペース作成をしてみます。
ワークスペース作成を行うとやはりエラーメッセージが表示されてしまいました。
API リクエスト エラー: Remote repository 'git@***/***.git' could not be reached.
スクリーンショット 2024-10-10 22.15.29

Logginで見てみます。
スクリーンショット 2024-10-10 22.20.54

Remote repository 'git@***/***.git' could not be reached.
先ほどと同様のエラーログが出力されていますね。

念の為インスタンスを起動して正常系も確認します。
スクリーンショット 2024-10-10 22.38.56

先ほどと同じくcurlで叩きます。

curl -X POST "https://dataform.googleapis.com/v1beta1/projects/プロジェクトID/locations/asia-northeast1/repositories/リポジトリ名/compilationResults" \
  --header "Authorization: Bearer $(gcloud auth print-access-token)" \
  --header "Content-Type: application/json" \
  --data '{"gitCommitish":"main"}'

今度はちゃんとコンパイルされました。

{
  "name": "projects/プロジェクトID/locations/asia-northeast1/repositories/リポジトリ名/compilationResults/a8c54d8b-d91a-4f1e-b58e-0c7633dd415f",
  "gitCommitish": "main",
  "codeCompilationConfig": {
    "defaultDatabase": "***",
    "defaultSchema": "dataform",
    "defaultLocation": "asia-northeast1"
  },
  "dataformCoreVersion": "2.8.3",
  "resolvedGitCommitSha": "53730f2714e2c2f8e1db23385cd99a0c8e1c9e4d",
  "createTime": "2024-10-10T13:36:31.727278643Z"
}

GCEが起動している状態でGitを停止させてみた場合も確認してみます。
今回使っているGitはGitLabなので以下のコマンドで停止しました。

sudo gitlab-ctl stop

curlを叩きます。

{
  "error": {
    "code": 400,
    "message": "Remote repository 'git@リポジトリURL/プロジェクト名.git' could not be reached.",
    "status": "INVALID_ARGUMENT"
  }
}

サーバが停止している時と同様でした。

まとめ

結果を表にすると以下となります。

状態 パターン 結果
GCEが停止 コンパイル Remote repository 'git@/.git' could not be reached
Gitが停止 コンパイル Remote repository 'git@/.git' could not be reached
GCEが停止 ワークスペース作成(Dataformの画面) API リクエスト エラー: Remote repository 'git@/.git' could not be reached
GCEが停止 ワークスペース作成(Logging) Remote repository 'git@/.git' could not be reached

上記よりGitリポジトリをホスティングしているサーバが停止していてDataformがリポジトリと接続できない時はHTTPステータスコード400(Bad Request)Remote repository 'git@***/***.git' could not be reached.が帰ってくるということが確認できました。
サーバ再起動中やその他様々な障害の時はまた異なった結果かもしれませんが一旦は上記を確認できて満足です。

この記事が何かの役に立てば嬉しいです。
それではまた。ナマステー

参考

https://cloud.google.com/dataform/docs/connect-repository?hl=ja

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.